package com.seed.bpmn.engine;

import com.seed.bpmn.engine.common.util.Page;
import com.seed.bpmn.engine.dto.FlowDTO;
import com.seed.bpmn.engine.dto.NodeDTO;
import com.seed.bpmn.engine.dto.ProcessDefinitionDTO;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * 流程模版（定义）服务接口
 *
 * @author cscz89@126.com
 */
public interface IBPMNRepositoryService {

    /**
     * 部署（发布）流程模版（新增流程模版）
     * @param name 部署名称
     * @param fileName 流程文件名称
     * @param category 流程分类
     * @param inputStream 流程文件流
     * @return
     * @throws Exception
     */
    public ProcessDefinitionDTO deploy(String name, String fileName, String category, InputStream inputStream) throws Exception;

    /**
     * 通过流程定义id获取流程定义
     * @param id 流程定义id
     * @return ProcessDefinitionDTO 流程定义对象
     * @throws Exception
     */
    public ProcessDefinitionDTO getProcessDefinition(String id) throws Exception;

    /**
     *通过流程定义名称、key分页查询流程模版
     * @param name 流程名称
     * @param key 流程定义key
     * @param page 分页对象
     * @return
     * @throws Exception
     */
    public List<ProcessDefinitionDTO> findProcessDefinitionByPage(String name, String key, Page page) throws Exception;

    /**
     * 根据流程定义key获取最新的激活状态的流程模版
     * @param key 流程定义key
     * @return
     * @throws Exception
     */
    public ProcessDefinitionDTO findProcessDefinitionByKey(String key)throws Exception;

    /**
     * 通过流程模版key获取最新流程模版中指定流程环节配置
     * @param processDefinitionKey 流程定义key
     * @param nodeId 流程环节ID
     * @return
     * @throws Exception
     */
    public NodeDTO getNodeByProcessDefinitionKey(String processDefinitionKey, String nodeId) throws Exception;

    /**
     * 通过流程模版ID获取流程所有环节配置
     * @param processDefinitionId 流程定义ID
     * @return
     * @throws Exception
     */
    public List<NodeDTO> getNodeByProcessDefinitionId(String processDefinitionId) throws Exception;

    /**
     * 通过流程模版ID获取指定流程环节配置
     * @param processDefinitionId 流程定义ID
     * @param nodeId 流程环节ID
     * @return
     * @throws Exception
     */
    public NodeDTO getNodeByProcessDefinitionId(String processDefinitionId, String nodeId) throws Exception;

    /**
     * 获取任务所在流程环节配置
     * @param taskId 任务ID
     * @return
     * @throws Exception
     */
    public NodeDTO getNodeByTaskId(String taskId) throws Exception;

    /**
     * 获取下一流转线信息
     * @param processDefinitionId 流程定id
     * @param taskId 任务id
     * @return
     * @throws Exception
     */
    public List<FlowDTO> getNextTransitions(String processDefinitionId, String taskId) throws Exception;

    /**
     * 获取下一流转线信息
     * @param processDefinitionId 流程定id
     * @param taskId 任务id
     * @param nodeId 流程环节Id
     * @return
     * @throws Exception
     */
    public List<FlowDTO> getNextTransitions(String processDefinitionId, String taskId, String nodeId) throws Exception;

    /**
     * 流程模版xml查询
     * @param processDefinitionId 流程定义id
     * @return
     * @throws Exception
     */
    public InputStream getProcessDefinitionXml(String processDefinitionId) throws Exception;

    /**
     * 流程模版image查询
     * @param processDefinitionId 流程定义id
     * @return
     * @throws Exception
     */
    public InputStream getProcessDefinitionImage(String processDefinitionId) throws Exception;

    /**
     * 获取流程定义（模版）资源
     * @param processDefinitionId 流程定义id
     * @param type 资源类型：xml、image
     * @return
     * @throws Exception
     */
    public InputStream getProcessDefinitionById(String processDefinitionId, String type) throws Exception;

    /**
     * 获取流程定义（模版）资源
     * @param processInstanceId 流程实例id
     * @param type 资源类型：xml、image
     * @return
     * @throws Exception
     */
    public InputStream getProcessDefinitionByProcessInstanceId(String processInstanceId, String type) throws Exception;

    /**
     * 流程删除流程定义（模版）
     * @param ids 需要删除流程定义（模版）ID列表
     * @throws Exception
     */
    public void deleteProcessDefinition(List<String> ids) throws Exception;

    /**
     * 批量激活与挂起流程定义（模版）
     * @param ids 需要更新流程定义（模版）ID列表
     * @param type 状态
     * @throws Exception
     */
    public void updateProcessDefinition(List<String> ids, int type) throws Exception;

    /**
     * 流程跟踪，获取每个节点对应的各种信息
     * @param processInstanceId 流程实例ID
     * @return
     * @throws Exception
     */
    List<Map<String, Object>> traceProcess(String processInstanceId) throws Exception;
}
